package com.heima.search.interceptor;

import com.heima.model.user.pojos.ApUser;
import com.heima.utils.thread.AppThreadLocalUtil;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//wemedia服务的拦截器(从网关(wemedia.gateway.AuthorizeFilter(将userId存入header))过来的)
//前端请求过来时，携带了token，经过网关(wemedia.gateway.AuthorizeFilter)里的AuthorizeFilter解析token后，
//将用户信息存入header中，请求(携带了header)来到当前拦截器(本类)之后，
// 本类的作用：从header中获取userId，并放入ThreadLocal(当前线程)中

//想要它生效，还需要在heima-leadnews-service\heima-leadnews-search\src\main\java\com\heima\search\config
//里配置WebMvcConfig配置类，并重写addInterceptors方法，将本类添加进去
public class AppTokenInterceptor implements HandlerInterceptor {
    //在请求处理之前进行调用（Controller方法调用之前）

    /**
     * 前置方法，在Controller方法执行之前执行
     * 得到header中的用户信息，并且放入当前线程ThreadLocal中
     * (前置用于将userId存入ThreadLocal中)
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取header中的userId(因为网关里的AuthorizeFilter.java下的filter写的是httpHeaders.add("userId", userId + "");)
        String userId = request.getHeader("userId");
        if(userId != null){
            //将包含userId的用户信息封装成对象，放入ThreadLocal中
            ApUser apUser = new ApUser();
            apUser.setId(Integer.valueOf(userId));
            AppThreadLocalUtil.setUser(apUser);
        }
        return true;
    }

    //后置处理在请求处理之后进行调用，但是在视图被渲染之前（Controller方法调用之后）
    @Override //清理当前的ThreadLocal
    // 所以新定义的拦截器是在当前的afterCompletion方法中清理，当前controller中的方法执行完成之后，他依然会执行当前的AppThreadLocalUtil.clear();方法清理AppThreadLocalUtil
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        AppThreadLocalUtil.clear();
    }


}

